"""
递归函数
闭包的深入理解
"""


# 递归函数
# n!=n*(n-1)*(n-2)... ...
def num(a):
    print(a)
    if a == 1:
        return 1
    else:
        return a * num(a - 1)


print(num(4))


# 菲波那切数列 第三个数字=前一个数字+前前一个数字之和
def num1(one, two, len):
    if len <= 2:
        return [one]
    else:
        return [one] + (num1(two, one + two, len - 1))


res = num1(2, 3, 8)
print(res)
"""
闭包的深入理解
1:闭包函数必须有内嵌函数
2：内嵌函数可以引用该内嵌函数上一级namespace(命名空间)的变量
3：闭包函数必须返回内嵌函数
python装饰器使用了闭包
优点：代码更加简介
      更容易拓展
"""


def outer():
    def inner():
        print("i am inner")

    return inner


# 调用
outer()()


# 闭包传参
def outer1(num):
    def inner(num_in):
        print("i am inner {}".format(num_in))
        return num + num_in

    return inner


# 调用
outer1(1)(2)
print(outer1(1)(2))
